#include <iostream>
#include <signal.h>
#include <unistd.h> // getpid
 
void Print(sigset_t &pending)
{
    for (int sig = 31; sig > 0; sig--)
    {
        if (sigismember(&pending, sig)) // 检测特定对应的信号是否在pending集中
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}
 
int main()
{
    sigset_t newset, oldset;
 
    // 清空信号集
    sigemptyset(&newset);
 
    // 添加2号信号
    sigaddset(&newset, SIGINT);
 
    // 屏蔽信号集
    if (sigprocmask(SIG_BLOCK, &newset, &oldset) == -1)
    {
        perror("sigprocmask");
        return 1;
    }
 
    std::cout << "Signal No.2 successfully blocked!" << "\n"
              << "pid: " << getpid() << std::endl;
 
 
    // 挂起进程，等待信号到达
    while (true)
    {
        sleep(2);
 
        sigset_t pending;
        sigpending(&pending);
        Print(pending);
    }
 
    // 恢复原来的信号屏蔽字
    if (sigprocmask(SIG_SETMASK, &oldset, NULL) == -1)
    {
        perror("sigprocmask");
        return 1;
    }
 
    return 0;
}